#!/usr/bin/env python3
#
# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Split WireGuard endpoint into address / port nodes to make use of common
# validators

import os

from sys import exit, argv
from vyos.configtree import ConfigTree
from vyos.utils.permission import chown
from vyos.utils.permission import chmod_750

def migrate_default_keys():
    kdir = r'/config/auth/wireguard'
    if os.path.exists(f'{kdir}/private.key') and not os.path.exists(f'{kdir}/default/private.key'):
        location = f'{kdir}/default'
        if not os.path.exists(location):
            os.makedirs(location)

        chown(location, 'root', 'vyattacfg')
        chmod_750(location)
        os.rename(f'{kdir}/private.key', f'{location}/private.key')
        os.rename(f'{kdir}/public.key', f'{location}/public.key')

if __name__ == '__main__':
    if len(argv) < 2:
        print("Must specify file name!")
        exit(1)

    file_name = argv[1]
    with open(file_name, 'r') as f:
        config_file = f.read()

    config = ConfigTree(config_file)
    base = ['interfaces', 'wireguard']

    migrate_default_keys()

    if not config.exists(base):
        # Nothing to do
        exit(0)

    # list all individual wireguard interface isntance
    for i in config.list_nodes(base):
        iface = base + [i]
        for peer in config.list_nodes(iface + ['peer']):
            base_peer = iface + ['peer', peer]
            if config.exists(base_peer + ['endpoint']):
                endpoint = config.return_value(base_peer + ['endpoint'])
                address = endpoint.split(':')[0]
                port = endpoint.split(':')[1]
                # delete old node
                config.delete(base_peer + ['endpoint'])
                # setup new nodes
                config.set(base_peer + ['address'], value=address)
                config.set(base_peer + ['port'], value=port)

    try:
        with open(file_name, 'w') as f:
            f.write(config.to_string())
    except OSError as e:
        print("Failed to save the modified config: {}".format(e))
        exit(1)
